package views;

import javax.swing.ButtonGroup;
import javax.swing.DefaultListModel;
import javax.swing.JFrame;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JScrollPane;

import net.sourceforge.jdatepicker.impl.JDatePanelImpl;
import net.sourceforge.jdatepicker.impl.JDatePickerImpl;
import net.sourceforge.jdatepicker.impl.UtilDateModel;

import javax.swing.JPanel;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.border.TitledBorder;
import javax.swing.border.LineBorder;

import java.awt.Color;

import javax.swing.JOptionPane;
import javax.swing.JRadioButton;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JButton;
import javax.swing.ListSelectionModel;

import core.models.dataModels.ResultVluchtenVoorBooking;
import core.models.dataModels.searchModels.ZoekGegVoorBookingModel;
import core.models.domainModel.Luchthaven;
import core.models.domainModel.Vlucht;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JList;

import controllers.VerwijderenBemanningVanEenVluchtController;
import controllers.createControllers.ToevoegenPersGegBookingController;
import controllers.createControllers.ToevoegenVluchtController;
import controllers.searchControllers.ZoekBookingController;
import controllers.searchControllers.ZoekVluchtController;
import controllers.updateControllers.UpdateVluchtController;
import java.awt.Font;

public class BookingZoekVluchtView extends JFrame {
	private static final long serialVersionUID = 1L;
	private JTextField txtDateVertrek;
	private JTextField txtDateAankomst;
	private JButton btnToevoegen;

	private JList<Vlucht> listResult;
	private JScrollPane scrollp;

	// verschillende modellen
	private ZoekGegVoorBookingModel _model;
	private ResultVluchtenVoorBooking _resultModel;

	public void selectError() {
		JOptionPane.showMessageDialog(null, "Gelieve een vlucht te selecteren");
	}

	public BookingZoekVluchtView(ZoekGegVoorBookingModel model) {

		this._model = model;
		setTitle("Booking: Selecteer vlucht");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		getContentPane().setBackground(Color.LIGHT_GRAY);
		setBackground(Color.LIGHT_GRAY);
		setResizable(false);
		setTitle("Booking: Selecteer vlucht");

		listResult = new JList<Vlucht>();
		listResult.setFont(new Font("Courier New", Font.BOLD, 12));
		scrollp = new JScrollPane(listResult);
		
		final JComboBox<Luchthaven> cBoxVertrekLuchthaven = new JComboBox<Luchthaven>(); // @Author:
																							// Lieven
																							// VDP
																							// -->
																							// Warnings
																							// weggewerkt

		JPanel pnlTypeStoel = new JPanel();
		pnlTypeStoel.setBackground(Color.LIGHT_GRAY);
		pnlTypeStoel.setBorder(new TitledBorder(new LineBorder(new Color(0, 0,
				0), 1, true), "Type stoel", TitledBorder.LEADING,
				TitledBorder.TOP, null, null));

		JLabel lblVertrekLuchthaven = new JLabel(
				"Selecteer uw vertrekluchthaven");

		JLabel lblAankomstluchthaven = new JLabel(
				"Selecteer uw aankomstluchthaven");

		final JComboBox<Luchthaven> cBoxAankomstLuchthaven = new JComboBox<Luchthaven>(); // @Author:
																							// Lieven
																							// VDP
																							// -->
																							// Warnings
																							// weggewerkt

		// comboboxen opvullen
		for (Luchthaven dit : _model.getLuchthavenLijst()) {
			cBoxAankomstLuchthaven.addItem(dit);
			cBoxVertrekLuchthaven.addItem(dit);
		}

		txtDateVertrek = new JTextField();
		txtDateVertrek.setColumns(10);

		JLabel lblDateVertrek = new JLabel("Vertekdatum");

		JLabel lblDateAankomst = new JLabel("Aankomstdatum");

		txtDateAankomst = new JTextField();
		txtDateAankomst.setColumns(10);

		final JButton btnZoekGeschikteVlucht = new JButton("Zoek vluchten");

		JLabel lblResultaten = new JLabel("Resultaten");

		final JButton btnVolgende = new JButton("Volgende");
		btnToevoegen = new JButton("Toevoegen");

		if(_model.getSchermModus() != null){
		switch(_model.getSchermModus()) {
			case "READ":
				btnVolgende.setVisible(false);
				btnToevoegen.setVisible(false);
				break;
			case "UPDATE":
				btnVolgende.setVisible(true);
				btnVolgende.setText("Aanpassen");
				btnToevoegen.setVisible(true);
				break;
			default:
				btnVolgende.setVisible(true);
				btnToevoegen.setVisible(false);
				break;
		}
		}
		else{
			btnVolgende.setVisible(true);
			btnToevoegen.setVisible(false);
		}

		// DT picker
		JDatePanelImpl datePanel1 = new JDatePanelImpl(new UtilDateModel(null));
		final JDatePickerImpl pickerVertrek = new JDatePickerImpl(datePanel1);
		JDatePanelImpl datePanel2 = new JDatePanelImpl(new UtilDateModel(null));
		final JDatePickerImpl pickerAankomst = new JDatePickerImpl(datePanel2);
		
		btnToevoegen.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				ToevoegenVluchtController.showView();
			}
		});


		listResult.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		GroupLayout groupLayout = new GroupLayout(getContentPane());
		groupLayout.setHorizontalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addGap(93)
					.addGroup(groupLayout.createParallelGroup(Alignment.LEADING)
						.addGroup(groupLayout.createSequentialGroup()
							.addComponent(btnVolgende, GroupLayout.PREFERRED_SIZE, 96, GroupLayout.PREFERRED_SIZE)
							.addPreferredGap(ComponentPlacement.UNRELATED)
							.addComponent(btnToevoegen))
						.addComponent(lblResultaten)
						.addComponent(lblDateVertrek)
						.addComponent(lblVertrekLuchthaven, GroupLayout.DEFAULT_SIZE, 964, Short.MAX_VALUE)
						.addComponent(lblDateAankomst, Alignment.TRAILING, GroupLayout.DEFAULT_SIZE, 964, Short.MAX_VALUE)
						.addGroup(groupLayout.createParallelGroup(Alignment.TRAILING, false)
							.addComponent(lblAankomstluchthaven, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 229, Short.MAX_VALUE)
							.addComponent(cBoxAankomstLuchthaven, Alignment.LEADING, 0, 239, Short.MAX_VALUE)
							.addComponent(cBoxVertrekLuchthaven, Alignment.LEADING, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
							.addComponent(pickerVertrek, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
						.addGroup(groupLayout.createSequentialGroup()
							.addGroup(groupLayout.createParallelGroup(Alignment.TRAILING, false)
								.addComponent(pickerAankomst, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
								.addComponent(pnlTypeStoel, Alignment.LEADING, GroupLayout.DEFAULT_SIZE, 237, Short.MAX_VALUE))
							.addGap(56)
							.addComponent(btnZoekGeschikteVlucht, GroupLayout.PREFERRED_SIZE, 147, GroupLayout.PREFERRED_SIZE))
						.addGroup(groupLayout.createSequentialGroup()
							.addPreferredGap(ComponentPlacement.RELATED)
							.addComponent(scrollp, GroupLayout.PREFERRED_SIZE, 830, GroupLayout.PREFERRED_SIZE)))
					.addContainerGap())
		);
		groupLayout.setVerticalGroup(
			groupLayout.createParallelGroup(Alignment.LEADING)
				.addGroup(groupLayout.createSequentialGroup()
					.addContainerGap()
					.addComponent(lblVertrekLuchthaven)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(cBoxVertrekLuchthaven, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addComponent(lblDateVertrek)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(pickerVertrek, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addComponent(lblAankomstluchthaven)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addComponent(cBoxAankomstLuchthaven, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addComponent(lblDateAankomst)
					.addPreferredGap(ComponentPlacement.RELATED)
					.addComponent(pickerAankomst, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addGroup(groupLayout.createParallelGroup(Alignment.TRAILING)
						.addComponent(pnlTypeStoel, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)
						.addComponent(btnZoekGeschikteVlucht, GroupLayout.PREFERRED_SIZE, 38, GroupLayout.PREFERRED_SIZE))
					.addGap(18)
					.addComponent(lblResultaten)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addComponent(scrollp, GroupLayout.PREFERRED_SIZE, 159, GroupLayout.PREFERRED_SIZE)
					.addPreferredGap(ComponentPlacement.UNRELATED)
					.addGroup(groupLayout.createParallelGroup(Alignment.BASELINE)
						.addComponent(btnVolgende)
						.addComponent(btnToevoegen))
					.addContainerGap(74, Short.MAX_VALUE))
		);

		final JRadioButton rdbtnEconomie = new JRadioButton("Economie");
		rdbtnEconomie.setBackground(Color.LIGHT_GRAY);
		pnlTypeStoel.add(rdbtnEconomie);

		rdbtnEconomie.setSelected(true);

		JRadioButton rdbtnZakelijk = new JRadioButton("Zakelijk");
		rdbtnZakelijk.setBackground(Color.LIGHT_GRAY);
		pnlTypeStoel.add(rdbtnZakelijk);
		getContentPane().setLayout(groupLayout);

		ButtonGroup radioButtons = new ButtonGroup();
		radioButtons.add(rdbtnZakelijk);
		radioButtons.add(rdbtnEconomie);
		rdbtnEconomie.setSelected(true);

		// ActionListeners
		btnVolgende.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if (listResult.getSelectedValue() == null) {
					selectError();
				} else {
					// bemanning verwijderen
					if (_model.ExtraKnop == "VerwijderenBemanning") {
						_model.enkeleVlucht = ((Vlucht) listResult
								.getSelectedValue());
						VerwijderenBemanningVanEenVluchtController
								.handleViewNaVolgende(_model);
					} else {

						// Type vlucht ophalen
						String t = "";
						if (rdbtnEconomie.isSelected() == true) {
							t = "E";
						} else {
							t = "B";
						}

						// TODO Auto-generated method stub
						if (e.getSource() == btnZoekGeschikteVlucht) {

							_model.setAankomstLuchthaven((Luchthaven) cBoxAankomstLuchthaven
									.getSelectedItem());
							_model.setVertrekLuchthaven((Luchthaven) cBoxVertrekLuchthaven
									.getSelectedItem());
							_model.setTypeVlucht(t);
							_model.setVertrekDatum(txtDateVertrek.getText());
							_model.setAankomstDatum(txtDateAankomst.getText());
							if (_model.getSchermModus() == "READ") {
								ZoekVluchtController.handleView(_model);
							} else {
								ZoekBookingController.handleView(_model);
							}
							FillResults(_resultModel);

						} else {
							if (e.getSource() == btnVolgende) {
								switch(_model.getSchermModus()) {
									case "UPDATE":
										int vluchtId = ((Vlucht) listResult
												.getSelectedValue()).getVluchtId();
										UpdateVluchtController.handleViewNext(vluchtId);
										break;
									default:
										Vlucht geselecteerdeVlucht = (Vlucht) listResult.getSelectedValue();
										if (geselecteerdeVlucht.getVrijeZitplaatsen() > 0) {
											ToevoegenPersGegBookingController.showview(
												(Vlucht) listResult.getSelectedValue(),
												t);
											ZoekBookingController.closeView(_model);
										} else {
											JOptionPane.showMessageDialog(null, "Geen zitplaatsen meer ter beschikking");
										}
										break;
								}
							}
						}
					}
				}
			}
		});

		btnZoekGeschikteVlucht.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {

				// Type vlucht ophalen
				String t = "";
				if (rdbtnEconomie.isSelected() == true) {
					t = "E";
				} else {
					t = "B";
				}

				// TODO Auto-generated method stub
				if (e.getSource() == btnZoekGeschikteVlucht) {

					_model.setAankomstLuchthaven((Luchthaven) cBoxAankomstLuchthaven
							.getSelectedItem());
					_model.setVertrekLuchthaven((Luchthaven) cBoxVertrekLuchthaven
							.getSelectedItem());
					_model.setTypeVlucht(t);
					// _model.setVertrekDatum(txtDateVertrek.getText());
					// _model.setAankomstDatum(txtDateAankomst.getText());

					// datum ophalen en invullen in model
					String datumA = "";
					String monthA = "";

					if ((pickerAankomst.getModel().getMonth() + 1) < 10) {
						monthA = "0"
								+ (pickerAankomst.getModel().getMonth() + 1);
					}
														
					datumA += pickerAankomst.getModel().getDay() + "/" + monthA
							+ "/" + pickerAankomst.getModel().getYear();

					// dt picker zonder selectie geeft blijkbaar toch resultaat,
					// dit vangen we hier op.

					if (pickerAankomst.getModel().isSelected() == false) {
						datumA = null;
					}

					_model.setAankomstDatum(datumA);

					String datumV = "";
					String monthV = "";

					if ((pickerVertrek.getModel().getMonth() + 1) < 10) {
						monthV = "0"
								+ (pickerVertrek.getModel().getMonth() + 1);
					}
					datumV += pickerVertrek.getModel().getDay() + "/" + monthV
							+ "/" + pickerVertrek.getModel().getYear();

					// dt picker zonder selectie geeft blijkbaar toch resultaat,
					// dit vangen we hier op.

					if (pickerVertrek.getModel().isSelected() == false) {
						datumV = null;
					}

					_model.setVertrekDatum(datumV);

					switch (_model.getSchermModus()) {
						case "READ":
							ZoekVluchtController.handleView(_model);
							break;
						case "UPDATE":
							UpdateVluchtController.handleViewSearch(_model);
							break;
						default:
							if (_model.ExtraKnop == "VerwijderenBemanning") {
								VerwijderenBemanningVanEenVluchtController
										.handleView(_model);
							} else {
								ZoekBookingController.handleView(_model);
							}
							break;
					}

					FillResults(_resultModel);
				} else {
					if (e.getSource() == btnVolgende) {
						ToevoegenPersGegBookingController.showview(
								(Vlucht) listResult.getSelectedValue(), t);
					}
				}
			}
		});
	}

	public void set_resultModel(ResultVluchtenVoorBooking _resultModel) {
		this._resultModel = _resultModel;
	}

	public void FillResults(ResultVluchtenVoorBooking modelIn) {
		int teller = 0;
		DefaultListModel<Vlucht> listModel = new DefaultListModel<Vlucht>();
		while (teller < (modelIn.getVluchtLijst()).size()) {
			listModel.addElement(modelIn.getVluchtLijst().get(teller));
			teller++;
		}

		listResult.setModel(listModel);
	}
}
